import pygame.font
# 鉴于需要创建飞船编组，导入Group和Ship类。
from pygame.sprite import Group
from ship import Ship

class Scoreboard:
    # 显示得分信息的类
    def __init__(self, ai_game):
        self.ai_game = ai_game
        # 初始化显示得分涉及的属性
        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        self.settings = ai_game.settings
        self.stats = ai_game.stats

        # 显示得分信息使用的字体设置
        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None, 48)
        # 准备初始化得分图像
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()

    def prep_score(self):
        # 将得分转换成一幅渲染的图像
        # 函数round()通常让小数精确到小数点后某一位,小数位数是由第二个实参指定的
        # 如果将第二个实参指定为负数，round()将舍入到最近的10的整数倍，如10、100、1000等
        rounded_score = round(self.stats.score, -1)
        # 将数值stats.score转换为字符串
        # score_str = str(self.stats.score)
        # 将数值转换为字符串时在其中插入逗号，例如，输出为1,000,000而不是1000000。
        score_str = "{:,}".format(rounded_score)
        # 再将这个字符串传递给创建图像的render()，为在屏幕上清晰地显示得分，向render()传递屏幕背景色和文本颜色。
        self.score_image = self.font.render(score_str, True, self.text_color, self.settings.bg_color)

        # 在屏幕右上角显示分数
        self.score_rect = self.score_image.get_rect()
        # 让其右边缘与屏幕右边缘相距20像素
        self.score_rect.right = self.screen_rect.right - 20
        # 让其上边缘与屏幕上边缘也相距20像素
        self.score_rect.top = 20

    def prep_high_score(self):
        # 将最高分转换为渲染的图像
        # 将最高得分舍入到最近的10的整数倍，并添加用逗号表示的千分位分隔符
        high_score = round(self.stats.high_score, -1)
        high_score_str = "{:,}".format(high_score)
        # 根据最高得分生成一幅图像
        self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.settings.bg_color)
        # 将最高分放在顶部中央
        self.high_score_rect = self.high_score_image.get_rect()
        # 水平居中
        self.high_score_rect.centerx = self.screen_rect.centerx
        self.high_score_rect.top = self.screen_rect.top

    def prep_level(self):
        # 将等级转换为渲染的图像
        level_str = str(self.stats.level)
        self.level_image = self.font.render(level_str, True, self.text_color, self.settings.bg_color)
        # 将等级放在得分下面
        self.level_rect = self.level_image.get_rect()
        # 其right属性设置为得分的right属性
        self.level_rect.right = self.score_rect.right
        # 将top属性设置为比得分图像的bottom属性大10像素，以便在得分和等级之间留出一定的空间
        self.level_rect.top = self.score_rect.bottom + 10

    def prep_ships(self):
        # 显示还余下多少艘飞船
        # 创建一个空编组self.ships，用于存储飞船实例
        self.ships = Group()
        # 为填充这个编组，根据玩家还有多少艘飞船以相应的次数运行一个循环
        for ship_number in range(self.stats.ship_left):
            ship = Ship(self.ai_game)
            # 创建新飞船并设置其x坐标，让整个飞船编组都位于屏幕左边，且每艘飞船的左边距都为10像素
            ship.rect.x = 10 + ship_number * ship.rect.width
            # 还将y坐标设置为离屏幕上边缘10像素，让所有飞船都出现在屏幕左上角
            ship.rect.y = 10
            # 将每艘新飞船都添加到编组ships中
            self.ships.add(ship)

    def show_score(self):
        # 在屏幕上显示得分，在屏幕上显示得分图像，并将其放在score_rect指定的位置
        self.screen.blit(self.score_image, self.score_rect)
        self.screen.blit(self.high_score_image, self.high_score_rect)
        self.screen.blit(self.level_image, self.level_rect)
        self.ships.draw(self.screen)

    def check_high_score(self):
        # 检查是否诞生了新的最高分
        if self.stats.score > self.stats.high_score:
            self.stats.high_score = self.stats.score
            self.prep_high_score()